"use strict";

const utils = require('../utils');

/**
 * 拦截器管理对象
 *
 * @class
 */
function InterceptorManager() {
  this.handlers = [];
}

/**
  * 将新的拦截器添加到堆栈中
  *
  * @param {Function} fulfilled 完成状态处理Promise的“then“函数
  * @param {Function} rejected 拒绝状态处理Promise的“catch”函数
  *
  * @return {Number} 一个ID，用于以后删除拦截器
  */
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
  this.handlers.push({
    fulfilled: fulfilled,
    rejected: rejected,
  });
  return this.handlers.length - 1;
}

/**
 * 从对战堆栈中移除拦截器
 */
InterceptorManager.prototype.eject = function eject(id) {
  if (this.handlers[id]) {
    this.handlers[id] = null;
  }
}

/**
 * 遍历所有已经注册的拦截器
 *
 * 该方法对于跳过可能已变为“空”调用“弹出”的所有拦截器特别有用。
 *
 * @param {Function} fn 调用每个拦截器的函数
 */
InterceptorManager.prototype.forEach = function forEach(fn) {
  utils.forEach(this.handlers, function forEachHandler(h) {
    if (h !== null) {
      fn(h);
    }
  });
};

module.exports = InterceptorManager;
